/* -*-jde-*- */
package ui.util;

import java.io.Serializable;


import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import javax.faces.event.ActionEvent;
import org.primefaces.event.map.PointSelectEvent;
import org.primefaces.event.map.StateChangeEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.LatLngBounds;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

/**
 * Componente geográfico La clase que da el acceso y control a la mapa de
 * localización de la vacante
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Enero 2012
 * @version 0.1
 */
@ManagedBean(name = "mapBean")
@SessionScoped
public class MapBean implements Serializable {

    private double latitud = 19.324213;
    private double longitud = -99.180625;
    private MapModel emptyModel;

    @Override
    public String toString() {
        return "MapBean{" + "latitud=" + getLatitud() + ", longitud=" + getLongitud() + '}';
    }

    public MapBean() {

        // valores para CU
        this.latitud = 19.324213;
        this.longitud = -99.180625;

    }

    public MapBean(double latitud, double longitud) {
        this.latitud = latitud;
        this.longitud = longitud;
    }

    public void addMarker(ActionEvent actionEvent) throws Exception {

        Marker marker = new Marker(new LatLng(latitud, longitud), "");

        // guardar en la base de datos.
        //polygon.add(new Point2D.Double(lat, lon));

        getEmptyModel().addOverlay(marker);
        Logger.getLogger(MapBean.class.getCanonicalName()).log(Level.INFO, " PUNTO: {0} {1}", new Object[]{latitud, longitud});

        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_INFO,
                "Lugar de trabajo añadido en:",
                "Lat:" + latitud + ", Lng:" + longitud));
    }

    public void onStateChange(StateChangeEvent event) {
        LatLngBounds bounds = event.getBounds();
        int zoomLevel = event.getZoomLevel();

        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Zoom Level", String.valueOf(zoomLevel)));
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Center", event.getCenter().toString())); // MODIFICADO!!!
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "NorthEast", bounds.getNorthEast().toString()));
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "SouthWest", bounds.getSouthWest().toString()));
    }

    public void onPointSelect(PointSelectEvent event) {
        LatLng latlng = event.getLatLng();

        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Point Selected", "Lat:" + latlng.getLat() + ", Lng:" + latlng.getLng()));

        setLatitud(latlng.getLat());
        setLongitud(latlng.getLng());
    }

    public void addMessage(FacesMessage message) {
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    /**
     * @return the latitud
     */
    public double getLatitud() {
        return latitud;
    }

    /**
     * @param latitud the latitud to set
     */
    public void setLatitud(double latitud) {
        this.latitud = latitud;
    }

    /**
     * @return the longitud
     */
    public double getLongitud() {
        return longitud;
    }

    /**
     * @param longitud the longitud to set
     */
    public void setLongitud(double longitud) {
        this.longitud = longitud;
    }

    /**
     * @return the emptyModel
     */
    public MapModel getEmptyModel() {
        return emptyModel;
    }

    /**
     * @param emptyModel the emptyModel to set
     */
    public void setEmptyModel(MapModel emptyModel) {
        this.emptyModel = emptyModel;
    }
}